連載 78 ワークステーションのおと 坂下秀 続・その後の T3400 ています。 NetNews の記事によれば、ネジ山を潰して す。 HDD を取り付けているネジは、かなり固く締まっ 番に外していけは陬り出せます。ここでも注意が必で を見間違えることはないでしよう。コネクタやネジを順 5. これで、やっと筐体か院全に 2 つに分離します。 HDD ケープルを突かないように注意してください。 だし、ピンセットの先端はとがっていますから、基板や 壊してしまいます。ピンセットなどを使いましよう。た 入りません。年理に手を入れるとコネクタやケープルを あります ) 。筐体はそれはど大きく開かないので、手が ( 同しような HDD のコネクタを割ってしまった経験が を加えると、ソケットやコネクタカリれてしまいます 端を持ち上げると外れるようになっています。理にカ ルムケープルのコネクタがすこし特殊で、ソケットの両 4. フィルムケープルとフラットケープルを外します。フィ まうとあとで泣くことになります。 らも切れやすく、コネクタも弱いので、大胆に開けてし ケープルとフラットケープルで結はれています。どち に分かれたように見える筐体は、かなり短いフィルム 3. ツメが外れたからといって安じ、してはいけません。 2 つ られているので、できるかぎり丁寧に開けます。 けます。筐体は、いかにも割れそうなツメで組み合わせ ばなりません。止めてあるネジを外したあと、筐体を開 2. これまた当然ですが、入れ替えるためには分解しなけれ けられなくなる場合があります。 1. もちろん、このようなことをすると、保守サーピスカ授 るときの注意恥頁を書いておきます。 4 万円弱でした ) に交換することができました。入れ替え のもの ( の MK1824FCV という型番で、秋葉原では 私カイ吏っている T3400 の HDD を、無事に 340MB UNIX MAGAZINE 1995.5 しまった人もいるようなので、最後の一瞬まで由断して はいけません。 6. 細かな作業を続けてきたので疲れているとは思います こまでの苦労を水の泡にしないためにも、ろ早す るとき以 - 日こ注意しながら新しい HDD を組み込み、元 に戻します。 7. ネジ止めを忘れたり、金属を内部に置き忘れたりしない ようにします。組み終えて持ち上げてみたらカラカラと 音がした、などということがないようにしましよう。 この交換を含めて 2 回はど分解しましたが、ただでさ え身体力嵶い私はネ聨釜をすり減らして寝込んでしまいまし た 1 。ですから、このような細工に自信がある人にしか勧 められませんにんな面倒なこと、誰もせーへんて ? ) 。 とにかく、あちこちの英斤を乗りきって、なんとカ噺し い HDD を組み込みました。 次は、この HDD を BIOS に認識させます。これは簡 単で、 T3400 を再起動し、メモリチェックのメッセージ が出るあたりで ESC キーを押すだけです。すると、セッ トアッフ。画面か現れて HDD を認識します。画面の右上 にある HDD の容量表小が 340MB になっているのを確 認します。 あとは、 DOS や Windows を順番にインストールして を彳こするだけです。 もう 1 つ注意です。・瓰匠、 NetNews の comp ・ sys. lap- top に次のような記事力寸殳稿されていました。 「 T3400 の初期のモデルでは、キーポード・コントロー ラ ( リピジョン 1.00 ) に不具合があり、キー入力を取りこ ほすことがある。これは、新しいコントローラ ( リピジョ ン 1.10 ) を載せたマザーポードに交換すれはる。コント ローラのリピジョンは、イ寸属している tdiags. exe コマン ド忍できる」 1 イ議なことにスキーに行ったらすっかり治ってしまいました 75
連載 / プログラマー入門ー 0 図 11 lorder の実行結果 % lorder sheepcount . 0 varl sheepcount . 0 sheepcount. 0 varl . 0 va て 1 . 0 var2.0 var2.0 sheepcount. 0 varl .0 sheepcount. 0 var2.0 るので、 lorder の出力には、 sheepcount. 0 sheepcount. 0 . 0 var2 . 0 という行かま t ます。また、 sheepcount. 。で参照してい る変数 vl と v2 はそれぞれ varl. 。と var2. 。で定義され ているので、 sheepcount . 0 varl. 0 sheepcount. 0 var2.0 となります。 lorder のおかげで畩存関係が分かるようになりました。 でも、まだまだ人間がこ窈青報からオプジェクト・ファイ ルの順番を決定するのは辛そうです。そこで今度は tsort コマンドの出番です。 tsort は lorder が出力する情報を もとに、オプジェクト・ファイルの順番を決めるコマンド です。 lorder オプジェクト・ファイルの列ー tsort のようになるので、 var2.0 varl . 0 sheepcount . 0 % lorder sheepcount . 0 varl . 0 var2.0 ー tsort varl. 0 、 var2.0 なら、 してくれます。たとえば、さきはどの とすると、アーカイプ・ライプラリに適した順番を示 sheepcount. 0 、 74 になっているのであっという間に礙します。 8 こ刎第一贓の実行をいてはいけません。互いを呼しける無艮ループ ago. c と niwatori. c は互いを参照しあっているので 8 場合があります。たとえば、リスト 10 ~ 11 に示した tam - ところで、 lorder と tsort を使っても順番を決めかねる ライプラリカイ乍れます。 のコマンドを実行すると一発で正しい順番のアーカイプ・ var2.0 ー tsort % ar q libright . a 'lorder sheepcount. 0 varl . 0 \ リスト 10 tamago. c の内容 tamago—ga—saki ( ) niwatori—ga—saki ( ) ; リスト 11 niwatori. c の内容 nivatori—ga—saki() tamago-ga-saki ( ) ; れらのオプジェクトに対して lorder を実行すると、 tamago ・ 0 tamago ・ 0 % lorder nlwatori. 0 tamago. 0 niwatori . 0 nxwatori .0 niwatori .0 tamago ・ 0 ta.mago. 0 nivatori. 0 ク・リンクについてです ラリについてお話ししました。次回はいよいよダイナミッ 今回は、スタティック・リンクとアーカイプ・ライプ ください。 は、変数や関数をどのファイルで定義するかを再検討して 開発中のライプラリにこのメッセージか明れたときに niwatori .0 tamago ・ 0 tsort : tamago ・ 0 : niwatori .0 tsort : cycle in data % lorder tamago ・ 0 niwatori . 0 ー tsort されます。 に通すと、以下のような、、 cycle だよ " メッセージか表示 で、このようなオプジェクト・ファイルを lorder と tsort いるようなときには本質的に順番を付けられません。そこ 複数のオプジェクト・ファイルの依存関係か禰環して となり、お互いに依存している結果になります。 UNIX MAGAZINE 1995.5 ( あらい・みちこ ASTEC)
連載 / プログラマー入門ー 0 図 10 sheep. 0 をリンクしたときのエラーメッセージ % cc ー 0 sheep sheep. 0 —L. —lcount 1d : . /libvrong. a : warning : archive has no table Of contents ; add one using て a Ⅱ 11b ( 1 ) ld : Undefined symbol _vl リスト 9 sheep. c の内容 main() printf ( ”羊が % d 匹 \ Ⅱ” , sheepcount ( ) ) ; すが、今回はエラーを出させるためにわざと ranlib を実 行しないでおきます。 次に、このライプラリを sheepcount() を呼び出すプロ グラム、 sheep. c ( リスト 9 ) とリンクさせます。すると、 なにやら賑やかにメッセージを表示しました ( 図 10 ) 。 1 行目のワーニングは ranlib を実行しなかったせいですか、 続いて、、シンポルが定義されていません " 工ラーも出てし まいました。 原因は、リンカが未定義のシンポルを探すメカニズムに あります。このリンカは未定義のシンポルをアーカイプ・ ライプラリの : 頁のファイルから順番にギ臻します。そし て、未定義のシンポルを定義しているファイルがみつかる と、そのファイルを結合します。しかし結合したファイル カ噺たな未定義のシンポルを含んでいると、まだ鮹夬でき ていない未定義のシンポルとあわせて、結合したファイル の次のファイルからまた順番に探します。 上の sheep. c 刎列で具イ勺な処理を追ってみましよう。 1. sheep. c のなかで参 . 照している sheepcount() 関数の 定義をライプラリから探す。 2. varl. 0 には sheepcout() の定義がみつからない。 3. sheepcount. 0 に関数 sheepcount() の定義がみつか る。 4. sheepcount. 0 を結合する。 5. sheepcount ・。に未定義の変数 vl 、 v2 があるので、続 けて次のファイルを詩ヾる。 6. var2. 。を謌べると変数 v2 の定義がみつかる。 7. var2. 。を結合する。 8. こオ人 -. ヒライプラリにファイルがないので変数 vl カ味 定 ) ままになる。 UNIX MAGAZINE 1995.5 変数 vl はライプラリの最初のファイル varl. c で定義 されています。ライプラリが 1 度しかスキャンされない 場合には、未定義工ラーになってしまいます。つまり、 % cc ー 0 sheep sheep. 0 —L. —lcount —lcount のように同しライプラリを 2 回スキャンさせれば未定義工 ラーは出なくなります。しかし、これはあまりにも手際の 悪いやり方ですれ しつは SunOS の場合、ライプラリ本を 1 度だけしか スキャンしないので目次ファイルがなければ上記のような 工ラーになります。でも、目次ファイルがあるときにはラ イプラリをスキャンせすに、目次ファイルから未定義シン ポルが定義されているファイルを直孑架しだすのでエラー カ起こらなくなります。 リンカが未定義シンポルを探す処理はシステム依存で、 目次ファイルを作らないシステムでもエラーカ起こらない こともあります。しかし、そのような場合にもオプジェク ト・ファイルの依存関イ系に注意して 1 度だけスキャンす ればすむような順番にオプジェクト・ファイルを並べると 効率の怖止力硼待できます。 上刎列のように叫屯なケースならばっと見ただけでもオ プジェクト・ファイルの依存関イ系が分かりますが、依存関 係がもっと複雑な場合には人手で処理するなんてとんでも ありません。そこで登場するのが人間に代わって依存関イ系 を考えてくれる専用ツールです。これを雇えば人間カ顴わ されることはなくなります。 lorder はオプジェクト・ファイルの依存関イ系を調べる コマンドです。引数としてオプジェクト・ファイル名を与 えると、ファイルどうしの依存関係を出力してくれます。 図 11 は、引数に sheepcount. 。、 varl. 0 、 var2.0 を指定 した例です。 1 行にファイル名が 2 個すっ並んでいます が、 1 番目がシンポルかれたファイル名、 2 番目がシン ポルか完義されているファイル名を示します。 関数 sheepcount() は sheepcount. 0 で定義されてい 73